﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TumbaloSoft.Models;
using System.Collections;
using System.Web.Helpers;
using TumbaloSoft.Helpers;
using TumbaloSoft.Helpers.QueryObjects;

namespace TumbaloSoft.Controllers
{
    public class ConvocatoriaJuntaController : TumbaloController
    {
        private static Object lockObject = new Object();
        public ActionResult Index(int? prIdEdificio)
        {
            if (defaultAction != null) return defaultAction;

            if (!prIdEdificio.HasValue) return HttpNotFound();
            Edificio edif;
            try
            {
                edif = HelperEdificio.selectById(prIdEdificio.Value);
                if (edif == null || edif.prEstado != "ADMINISTRADO") return HttpNotFound();
                ViewBag.prIdEdificio = prIdEdificio.Value;
                ViewBag.ListaConvocatorias = HelperConvocatoriaJunta.selectByIdEdificio(prIdEdificio.Value);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al obtener lista de edificios ", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            return View();
        }
        public ActionResult Registrar (int? prIdEdificio)
        {
            if (defaultAction != null) return defaultAction;

            if (!prIdEdificio.HasValue) return HttpNotFound();
            Edificio edif;
            try
            {
                edif = HelperEdificio.selectById(prIdEdificio.Value);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al cargar un edificio", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            if (edif == null || edif.prEstado != "ADMINISTRADO") return HttpNotFound();
            ViewBag.prIdEdificio = prIdEdificio.Value;
            return View();
        }
        

        [HttpPost]
        public ActionResult Registrar(ConvocatoriaJunta convocatoria)
        {
            if (defaultAction != null) return defaultAction;

            if (ModelState.IsValidField("prEdificio.prIdEdificio") && ModelState.IsValidField("prFecha") &&
               ModelState.IsValidField("prHora")&& ModelState.IsValidField("prLugar") )
            {
                try
                {
                    lock (lockObject)
                    {
                        convocatoria.prIdReunion = HelperConvocatoriaJunta.selectMaxCodigo() + 1;
                        HelperConvocatoriaJunta.insert(convocatoria);
                    }
                    ViewBag.mensaje = "Se registró la convocatoria con éxito.";
                    ViewBag.returnURL = "/ConvocatoriaJunta?prIdEdificio=" + convocatoria.prEdificio.prIdEdificio;
                    return View("~/Views/Shared/Exito.cshtml");
                }
                catch(Exception ex)
                {
                    Logger.Current.Error("Error al registrar un edificio", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
            }
            else return View(convocatoria);
        }

        public ActionResult Modificar(int? prIdConvocatoria)
        {
            if (defaultAction != null) return defaultAction;

            if (!prIdConvocatoria.HasValue) return HttpNotFound();
            ConvocatoriaJunta convocatoria;
            try
            {
                convocatoria = HelperConvocatoriaJunta.selectById(prIdConvocatoria.Value);
                if (convocatoria == null) return HttpNotFound();
                convocatoria.prHora = DateTime.Parse(convocatoria.prHoraText);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al cargar un edificio", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            if (convocatoria == null || convocatoria.prEstado=="ELIMINADO") return HttpNotFound();
            return View(convocatoria);
        }

        [HttpPost]
        public ActionResult Modificar(ConvocatoriaJunta convocatoria)
        {
            if (defaultAction != null) return defaultAction;

            if ((ModelState.IsValidField("prFecha") || convocatoria.prFecha == new DateTime()) &&
               ModelState.IsValidField("prHora") && ModelState.IsValidField("prAcuerdos")
                && ModelState.IsValidField("prLugar"))
            {
                try
                {
                    HelperConvocatoriaJunta.update(convocatoria);
                }
                catch(Exception ex)
                {
                    Logger.Current.Error("Error al modificar un edificio", ex);
                    return View("~/Views/Shared/Error.cshtml");
                }
                ViewBag.mensaje = "Se modificó la convocatoria con éxito.";
                ViewBag.returnURL = "/ConvocatoriaJunta?prIdEdificio="+convocatoria.prEdificio.prIdEdificio;
                return View("~/Views/Shared/Exito.cshtml");
            }
            else
            {
                return View(convocatoria);
            }
        }

        public ActionResult Eliminar(int? prIdConvocatoria)
        {
            if (defaultAction != null) return defaultAction;

            if (!prIdConvocatoria.HasValue) return HttpNotFound();
            ConvocatoriaJunta convocatoria;
            try
            {
                convocatoria = HelperConvocatoriaJunta.selectById(prIdConvocatoria.Value);
                if (convocatoria == null) return HttpNotFound();
                convocatoria.prHora = DateTime.Parse(convocatoria.prHoraText);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al cargar un edificio", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            if (convocatoria == null || convocatoria.prEstado == "ELIMINADO") return HttpNotFound();
            return View(convocatoria);
        }
        [HttpPost]
        public ActionResult Eliminar(ConvocatoriaJunta convocatoria)
        {
            if (defaultAction != null) return defaultAction;

            try
            {
                HelperConvocatoriaJunta.delete(convocatoria);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al eliminar un edificio", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            ViewBag.mensaje = "Se canceló la convocatoria con éxito.";
            ViewBag.returnURL = "/ConvocatoriaJunta?prIdEdificio=" + convocatoria.prEdificio.prIdEdificio;
            return View("~/Views/Shared/Exito.cshtml");
        }
        public ActionResult Convocatoria(int? prIdConvocatoria)
        {
            //if (defaultAction != null) return defaultAction;

            if (!prIdConvocatoria.HasValue) return HttpNotFound();
            ConvocatoriaJunta convocatoria;
            try
            {
                convocatoria = HelperConvocatoriaJunta.selectById(prIdConvocatoria.Value);
                convocatoria.prHora = DateTime.Parse(convocatoria.prHoraText);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al cargar el reporte de convocatoria", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            if (convocatoria == null || convocatoria.prEstado == "ELIMINADO") return HttpNotFound();
            return View(convocatoria);
        }
        public ActionResult ConvocatoriaPDF(int? prIdConvocatoria)
        {
            if (defaultAction != null) return defaultAction;

            if (!prIdConvocatoria.HasValue) return HttpNotFound();
            try
            {
                ConvocatoriaJunta convocatoria = HelperConvocatoriaJunta.selectById(prIdConvocatoria.Value);
                convocatoria.prHora = DateTime.Parse(convocatoria.prHoraText);
                if (convocatoria == null || convocatoria.prEstado == "ELIMINADO") return HttpNotFound();
                HelperPDF.HtmlToPDF("ConvocatoriaJunta/Convocatoria?prIdConvocatoria=" + prIdConvocatoria, "Cuota", 0, this);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error al cargar el reporte de convocatoria en PDF", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            return View("~/Views/Shared/Exito.cshtml");
        }
    }
}
